/*
 * To change this template, choose Tools | Templates
 * and open the template in the editopu.
 */
package sv.com.intesal.seguridad.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.bean.Formulario;
import sv.com.intesal.seguridad.bean.Modulo;
import sv.com.intesal.seguridad.bean.PerfilUsuario;
import sv.com.intesal.seguridad.sql.SQLPerfilUsuario;
import sv.com.intesal.seguridad.sql.SQLRoles;

/**
 *
 * @author ejerez
 */
public class PerfilUsuarioControlador {

    /**CUANDO INGRESAN UN FORMULARIO NUEVO.
     *IR A TRAER TODOS LOS ROLES DE LA TABLA ROL E INSERTAR SIN PRIVILEGIOS
     */
    public void insertPerfil_Usuario_x_Formulario() throws Exception {


        ResultSet rs = null;
        Connection cnn = null;
        try {
            cnn = cConexion.conectar();

            FormularioControlador fc = new FormularioControlador();
            Integer getMax = fc.getMax();

            UsuarioControlador uc = new UsuarioControlador();
            rs = uc.getUsuarios();

            while (rs.next()) {
                PreparedStatement ps = null;
                ps = cnn.prepareStatement(SQLPerfilUsuario.insertPerfil_Usuario);
                ps.setInt(1, getMax);
                ps.setInt(2, rs.getInt("codigo_p"));
                ps.setString(3, "NO");
                ps.setString(4, "NO");
                ps.setString(5, "NO");
                ps.setString(6, "NO");
                ps.setString(7, "NO");
                ps.executeUpdate();
                ps.close();
            }
        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }

    /**
     * CUANDO INGRESAN UN NUEVO ROL, IR A TRAER TODOS LOS FORMULARIOS E INSERTAR EN LA
     * TABLA DE ROL_USUARIO SIN PRIVILEGIOS.
     */
    public void insertPerfil_Usuario() throws Exception {

        ResultSet rs = null;
        Connection cnn = null;

        try {
            cnn = cConexion.conectar();

            PerfilControlador pc = new PerfilControlador();
            Integer getMax = pc.getMax();

            FormularioControlador fc = new FormularioControlador();
            rs = fc.getFormularios();

            while (rs.next()) {
                PreparedStatement ps = null;
                ps = cnn.prepareStatement(SQLPerfilUsuario.insertPerfil_Usuario);
                ps.setInt(1, rs.getInt("codigo_f"));
                ps.setInt(2, getMax);
                ps.setString(3, "NO");
                ps.setString(4, "NO");
                ps.setString(5, "NO");
                ps.setString(6, "NO");
                ps.setString(7, "NO");
                ps.executeUpdate();
                ps.close();
            }

        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }

    public void updatePerfil(PerfilUsuario pu) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLPerfilUsuario.updatePerfil_Usuario);
            String yes = "SI";
            String no = "NO";

            if (pu.getAgregar_r() == false) {
                ps.setString(1, no);
            } else {
                ps.setString(1, yes);
            }

            if (pu.getModificar_r() == false) {
                ps.setString(2, no);
            } else {
                ps.setString(2, yes);
            }

            if (pu.getBuscar_r() == false) {
                ps.setString(3, no);
            } else {
                ps.setString(3, yes);
            }

            if (pu.getEliminar_r() == false) {
                ps.setString(4, no);
            } else {
                ps.setString(4, yes);
            }

            if (pu.getVisible_r() == false) {
                ps.setString(5, no);
            } else {
                ps.setString(5, yes);
            }

            if (pu.getReporte_r() == false) {
                ps.setString(6, no);
            } else {
                ps.setString(6, yes);
            }
            ps.setInt(7, pu.getCodigo_r());
            ps.executeUpdate();

            cnn.close();
            ps.close();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getImodificada());

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void updatePerfiles_Especiales(PerfilUsuario pu) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;

        try {
            cnn = cConexion.conectar();

            if (pu.getAll_modulos() == true && pu.getAll_perfiles() == true) {
                /*UPDATE TODOSO LOS MODULOS Y PERFILES*/
                ps = cnn.prepareStatement(SQLPerfilUsuario.updatePerfil_Usuario_Formulario_x_Perfil_All);
            } else if (pu.getAll_modulos() == true) {
                /*UPDATE 1 PERFIL CON TODOS LOS FORMULARIOS(MODULOS)*/
                ps = cnn.prepareStatement(SQLPerfilUsuario.updatePerfil_Usuario_Formulario_All);
                ps.setInt(7, pu.getCodigo_p());
            } else if (pu.getAll_perfiles() == true) {
                /*UPDATE TODOS LOS EPRFILES QUE EXISTEN*/
                ps = cnn.prepareStatement(SQLPerfilUsuario.updatePerfil_Usuario_Perfil_All);
            } else {
                ps = cnn.prepareStatement(SQLPerfilUsuario.updatePerfil_Usuario_Perfil);
                ps.setInt(7, pu.getCodigo_p());
                ps.setInt(8, pu.getCodigo_m());
            }

            String yes = "SI";
            String no = "NO";

            if (pu.getAgregar_all_r() == false) {
                ps.setString(1, no);
            } else {
                ps.setString(1, yes);
            }

            if (pu.getModificar_all_r() == false) {
                ps.setString(2, no);
            } else {
                ps.setString(2, yes);
            }

            if (pu.getBuscar_all_r() == false) {
                ps.setString(3, no);
            } else {
                ps.setString(3, yes);
            }

            if (pu.getEliminar_all_r() == false) {
                ps.setString(4, no);
            } else {
                ps.setString(4, yes);
            }

            if (pu.getVisible_all_r() == false) {
                ps.setString(5, no);
            } else {
                ps.setString(5, yes);
            }

            if (pu.getReporte_all_r() == false) {
                ps.setString(6, no);
            } else {
                ps.setString(6, yes);
            }
            ps.executeUpdate();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getImodificada());

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setPerfil_Usuario_x_Formularios() throws Exception {
        try {

            ResultSet rs_perfil = null;
            ResultSet rs_formulario = null;

            FormularioControlador fc = new FormularioControlador();
            PerfilControlador rc = new PerfilControlador();
            rs_perfil = rc.getPerfiles_x_Sucursal();




            while (rs_perfil.next()) {
                /*MANADAR A TRAER TODOS LOS ROLES Y FORMULARIOS y ASIGNAR ROLES NULOS*/
                rs_formulario = fc.getFormularios();


                while (rs_formulario.next()) {

                    /*SI YA TIENE REGISTRO NOS DEVUELVE FALSO*/
                    if (this.validarUsuario_x_Formluario(rs_perfil.getInt("codigo_p"), rs_formulario.getInt("codigo_f")) == true) {

                        PreparedStatement ps = null;
                        Connection cnn = null;
                        cnn = cConexion.conectar();

                        ps = cnn.prepareStatement(SQLPerfilUsuario.insertPerfil_Usuario);
                        ps.setInt(1, rs_formulario.getInt("codigo_f"));
                        ps.setInt(2, rs_perfil.getInt("codigo_p"));
                        ps.setString(3, "NO");
                        ps.setString(4, "NO");
                        ps.setString(5, "NO");
                        ps.setString(6, "NO");
                        ps.setString(7, "NO");
                        ps.executeUpdate();
                        ps.close();


                    }
                }
            }

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIinformation());


        } catch (Exception e) {
            throw new Exception(e);


        }
    }

    /**
     * VALIDAR SI EL USUARIO TIENE YA ASIGNADO EL FORMULARIO.
     * ENTONCES NO TIENE UN REGISTRO EN ROLES SERA TRUE
     */
    private Boolean validarUsuario_x_Formluario(Integer codigo_p, Integer codigo_f) throws Exception {
        PreparedStatement ps = null;
        Connection cnn = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLPerfilUsuario.getCountPerfil_x_Formulario);
            ps.setInt(1, codigo_p);
            ps.setInt(2, codigo_f);
            rs = ps.executeQuery();
            rs.next();
            if (rs.getInt("count") >= 1) {
                return false; // ingresar registro en roles
            }
            return true; // no ingresar ningun registro en roles
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<PerfilUsuario> getPerfiles(Integer codigo_p) throws Exception {

        List<PerfilUsuario> lista = new ArrayList<PerfilUsuario>();
        try {
            Connection cnn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;

            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLPerfilUsuario.getPerfil_Usuario);
            //ps.setInt(1, Variables_Globales.var_codigo_u);
            ps.setInt(1, codigo_p);
            rs = ps.executeQuery();

            while (rs.next()) {
                PerfilUsuario pu = new PerfilUsuario();
                pu.setCodigo_r(rs.getInt("codigo_pu"));

                pu.setNombre_p(rs.getString("nombre_p"));
                pu.setCodigo_p(rs.getInt("codigo_p"));
                pu.setEstado_p(rs.getString("estado_p"));

                Modulo mo = new Modulo();
                mo.setCodigo_m(rs.getInt("codigo_m"));
                mo.setNombre_m(rs.getString("nombre_m"));

                Formulario f = new Formulario();
                f.setCodigo_f(rs.getInt("codigo_f"));
                f.setNombre_f(rs.getString("nombre_f"));
                f.setNombre_form_f(rs.getString("nombre_form_f"));

                pu.setModulo(mo);
                pu.setFormulario(f);

                pu.setAgregar(rs.getString("agregar_pu"));
                pu.setModificar(rs.getString("modificar_pu"));
                pu.setEliminar(rs.getString("eliminar_pu"));
                pu.setBuscar(rs.getString("buscar_pu"));
                pu.setVisible(rs.getString("visible_pu"));
                pu.setReporte(rs.getString("reporte_pu"));

                if (rs.getString("agregar_pu").equals("SI")) {
                    pu.setAgregar_r(Boolean.TRUE);
                } else {
                    pu.setAgregar_r(Boolean.FALSE);
                }

                if (rs.getString("modificar_pu").equals("SI")) {
                    pu.setModificar_r(Boolean.TRUE);
                } else {
                    pu.setModificar_r(Boolean.FALSE);
                }

                if (rs.getString("eliminar_pu").equals("SI")) {
                    pu.setEliminar_r(Boolean.TRUE);
                } else {
                    pu.setEliminar_r(Boolean.FALSE);
                }

                if (rs.getString("buscar_pu").equals("SI")) {
                    pu.setBuscar_r(Boolean.TRUE);
                } else {
                    pu.setBuscar_r(Boolean.FALSE);
                }

                if (rs.getString("visible_pu").equals("SI")) {
                    pu.setVisible_r(Boolean.TRUE);
                } else {
                    pu.setVisible_r(Boolean.FALSE);
                }
                if (rs.getString("reporte_pu").equals("SI")) {
                    pu.setReporte_r(Boolean.TRUE);
                } else {
                    pu.setReporte_r(Boolean.FALSE);
                }
                lista.add(pu);
            }
            rs.close();
            ps.close();
            cnn.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private ResultSet getPerfilUsuario_x_Perfil(Integer codigo_p) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLPerfilUsuario.getPerfil_Usuario);
            ps.setInt(1, codigo_p);
            rs = ps.executeQuery();
            return rs;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setAsignarPerfil_x_Usuario(Integer codigo_p, Integer codigo_u) throws Exception {

        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLRoles.update_Roles_x_Asiginacion_x_PerfilUsuario);

            ps.setInt(1, codigo_p);
            ps.setInt(2, codigo_p);
            ps.setInt(3, codigo_p);
            ps.setInt(4, codigo_p);
            ps.setInt(5, codigo_p);
            ps.setInt(6, codigo_p);
            ps.setInt(7, codigo_u);
            ps.executeUpdate();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getImodificada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void insert_Perfil_Formulario_PerfilUsuario() throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLPerfilUsuario.insert_Perfil_Formulario_PerfilUsuario);
            ps.executeUpdate();
            ps.close();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
